/**
 * @file MQTTManager.h
 * @brief MQTT客户端管理类头文件
 * 
 * 提供MQTT连接、消息发布订阅、命令处理和状态管理功能
 * 基于AsyncMqttClient实现异步MQTT通信
 */

#ifndef MQTTMANAGER_H
#define MQTTMANAGER_H

#include <WiFi.h>
#include <AsyncMqttClient.h>
#include <ArduinoJson.h>
#include <functional>
#include "MQTTTopicManager.h"

class MQTTManager {
private:
    AsyncMqttClient mqttClient;        ///< MQTT客户端对象
    unsigned long lastReconnectAttempt; ///< 上次重连尝试时间
    bool mqttConnected;                ///< MQTT连接状态
    bool allowReconnect;               ///< 允许自动重连标志

    String mqttServer;                 ///< MQTT服务器地址
    int mqttPort;                      ///< MQTT服务器端口
    String mqttUser;                   ///< MQTT用户名
    String mqttPassword;               ///< MQTT密码
    
    MQTTTopicManager topicManager;     ///< 主题管理器

    // MQTT事件回调
    void onMqttConnect(bool sessionPresent);
    void onMqttDisconnect(AsyncMqttClientDisconnectReason reason);
    void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, 
                      size_t len, size_t index, size_t total);
    void onMqttSubscribe(uint16_t packetId, uint8_t qos);
    void onMqttUnsubscribe(uint16_t packetId);
    void onMqttPublish(uint16_t packetId);
    
    // 命令处理方法
    void handleCommandRequest(JsonDocument& doc, String requestId);
    void handleConfigSet(JsonDocument& doc, String requestId);
    void handleManagementCommand(JsonDocument& doc, String requestId);
    
    // 具体命令实现
    void handleDisplayControl(String state, String requestId);
    void handleIntervalControl(String type, unsigned long interval, String requestId);
    void handleStatusQuery(String requestId);
    void handleFeatureStatusQuery(String requestId);
    void handleRestartCommand(String requestId);
    void handleConfigModeCommand(String requestId);

    /**
     * @brief 发布连接状态
     */
    void publishConnectionStatus();

public:
    MQTTManager();
    
    /**
     * @brief 初始化MQTT连接
     * @return true-初始化成功, false-初始化失败
     */
    bool init();
    
    /**
     * @brief 处理MQTT事件(在loop中调用)
     */
    void handleMQTT();
    
    // 消息发布方法
    void publishSensorData(float temperature, float humidity, int rssi);
    void publishMessage(const char* topic, const char* message);
    void publishJsonMessage(const char* topic, JsonDocument& doc);
    
    // 订阅管理
    void subscribe(const char* topic);
    void unsubscribe(const char* topic);
    
    // 连接管理
    void disconnect();
    void reconnect();
    bool isConnected();
    
    // 重连控制
    void stopReconnect();
    void allowReconnections();
    
    // 服务器配置
    void setMQTTServer(String server, int port, String user, String password);
    void setDefaultServer();
    
    // 连接测试
    bool testServerConnectivity();
    void fullReset();
    
    // 状态信息
    String getConnectionStatus();
    String getFeatureStatus();
    
    // 参数设置
    void setSensorReadInterval(unsigned long interval);
    void setPublishInterval(unsigned long interval);
    unsigned long getSensorReadInterval();
    unsigned long getPublishInterval();
    
    // 功能控制
    void setDisplayState(bool state);
    bool getDisplayState();

    // 屏幕间隔控制
    void setDisplayInterval(unsigned long interval);  ///< 设置屏幕更新间隔
    unsigned long getDisplayInterval();               ///< 获取屏幕更新间隔
    
    // 获取主题管理器
    MQTTTopicManager& getTopicManager() { return topicManager; }
};

// 全局回调函数声明
void setDisplayRefreshCallback(std::function<void()> callback);
void setSensorIntervalCallback(std::function<void(unsigned long)> callback);
void setPublishIntervalCallback(std::function<void(unsigned long)> callback);
void setDisplayIntervalCallback(std::function<void(unsigned long)> callback);  // 新增

#endif